题解 AT2201@洛谷 | 2201@Atcoder 【鏡文 / Mirror String】

首先,我们用字符串s1来进行操作,s用来对照。题目说1<=|s|<=10^5,因此数组开大一点。其次,容易想到,|s|是奇数时不可能满足条件,故加上:

if(l&1)
{
	cout<<"No"<<endl;
    return 0;
}

其中&按位与运算

之后,分两步,如题。

写出下列代码:

for(int i=0;i<l;i++) s1[i] = s[l-i-1]; 
for(int i=0;i<l;i++)
{
	if(s1[i] == 'b') s1[i] = 'd';
	else if(s1[i] == 'd') s1[i] = 'b';
	else if(s1[i] == 'p') s1[i] = 'q';
	else s1[i] = 'p';
}

综合以上,判断字符串相等,使用strcmp()

综合所有,下为完整代码:

#include <iostream>
#include <string.h>
using namespace std;

char s[100010];
char s1[100010];

int main()
{
	cin>>s;
	int l = strlen(s);
	if(l&1)
	{
		cout<<"No"<<endl;
		return 0;
	}
	for(int i=0;i<l;i++) s1[i] = s[l-i-1]; 
	for(int i=0;i<l;i++)
	{
		if(s1[i] == 'b') s1[i] = 'd';
		else if(s1[i] == 'd') s1[i] = 'b';
		else if(s1[i] == 'p') s1[i] = 'q';
		else s1[i] = 'p';
	}
	if(!strcmp(s1, s)) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	return 0;
}